package com.saydc.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.saydc.exceptions.UnableToDeleteException;
import com.saydc.model.UnidadOrganizativa;
import com.saydc.utils.HibernateUtils;

public class UnidadOrganizativaDAO {
	
	private static UnidadOrganizativaDAO unidadOrganizativaDao;
	
	public static UnidadOrganizativaDAO getInstance(){
		if(unidadOrganizativaDao == null){
			unidadOrganizativaDao = new UnidadOrganizativaDAO();
		}
		return unidadOrganizativaDao;
	}

	@SuppressWarnings("unchecked")
	public ArrayList<UnidadOrganizativa> getAreasOrganizativas(){
		ArrayList<UnidadOrganizativa> listaUnidades = new ArrayList<UnidadOrganizativa>();
		Session session = HibernateUtils.currentSession();
		listaUnidades.addAll((List<UnidadOrganizativa>)session.createQuery("select u from UnidadOrganizativa u").list());
		return listaUnidades;
	}
	
	public void altaUnidadOrganizativa(UnidadOrganizativa unidad){
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.save(unidad);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al insertar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}

	public void borrarUnidadOrganizativa(UnidadOrganizativa unidad) throws UnableToDeleteException {
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.delete(unidad);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al borrar en la base [eliminar unidad organizativa]");
			throw new UnableToDeleteException("El objeto se encuentra referenciado");
		}finally{
			HibernateUtils.closeSession();
		}
	}

	public void actualizarUnidadOrganizativa(UnidadOrganizativa unidad) {
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.update(unidad);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al actualizar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}
	
	public UnidadOrganizativa getUnidadOrganizativa(Integer idUnidad){
		Session session = HibernateUtils.currentSession();
		UnidadOrganizativa unidad = (UnidadOrganizativa)session.load(UnidadOrganizativa.class, idUnidad);
		//UnidadOrganizativa unidad = this.getUnidadCriteria(session, idUnidad);
		return unidad;
	}
	
	private UnidadOrganizativa getUnidadCriteria(Session session, Integer idUnidad) {
		return (UnidadOrganizativa)session.createCriteria(UnidadOrganizativa.class).add(Restrictions.eq("idUnidad", idUnidad)).uniqueResult();
	}
}
